package com.ynet.middleground.approve.listener.realistic;

import java.util.List;

import org.activiti.engine.HistoryService;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricTaskInstanceQuery;
import org.activiti.engine.impl.el.FixedValue;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;

import com.ynet.core.exception.BusinessException;
import com.ynet.middleground.approve.cmd.SpringContextUtils;

/**
 * @ClassName
 * @Description 具象化审批-场景三监听器；
 * @Author liwq
 * @Date 2021/1/25 11:26
 * @Version 1.0
 */
@Component
@DependsOn("springContextUtils")
public class SameApproverListener implements TaskListener {

    private TaskService taskService = SpringContextUtils.getBean(TaskService.class);
    private HistoryService historyService = SpringContextUtils.getBean(HistoryService.class);

    /**
     * 几个拥有相同审批角色的节点中，第一个节点的主键ID;
     */
    private FixedValue firstNodePrimaryKeyId;

    /**
     * 存在多个审批节点由同一角色进行审批， 则首个该角色审批节点中的审批人，为该审批任务中后面其他审批节点的默认审批人
     * 
     * @param delegateTask
     */
    @Override
    public void notify(DelegateTask delegateTask) {
        // Step1: 初步整理所需参数
        // 获取流程实例ID
        String processInstanceId = delegateTask.getProcessInstanceId();
        // 从监听器变量取出配置的 第一个节点的主键ID
        String idKeyValue = firstNodePrimaryKeyId.getExpressionText();

        // Step2: 根据 流程实例ID+节点主键ID 获取审批记录，找出第一个节点的审批人
        if (StringUtils.isEmpty(idKeyValue)) {
            throw new BusinessException("请配置监听器参数：第一个节点的主键ID", "SALR0001");
        }
        if (!StringUtils.isEmpty(processInstanceId) && !StringUtils.isEmpty(idKeyValue)) {
            // Step2.1: 根据 流程实例ID+节点主键ID 获取审批记录
            HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery()
                .includeTaskLocalVariables().includeProcessVariables().orderByTaskCreateTime().asc();
            List<HistoricTaskInstance> list =
                historicTaskInstanceQuery.processInstanceId(processInstanceId).taskDefinitionKey(idKeyValue).list();
            if (list.size() > 0) {
                // Step2.2: 得到第一个节点的审批人
                HistoricTaskInstance historicTaskInstance = list.get(0);
                String assignee = historicTaskInstance.getAssignee();

                // Step3: 指定该节点审批人为：步骤2找出的审批人
                if (!StringUtils.isEmpty(assignee)) {
                    taskService.setAssignee(delegateTask.getId(), assignee);
                }
            }
        }
    }
}
